package com.jfinal.plugin.sqlbuilder;

import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.Map;

public class SearchKit {

    public static final Logger log = LoggerFactory.getLogger(SearchKit.class);

    /**
     * 查询所有数据。
     *
     * @param sqlKey SQL语句模板。
     * @param params 查询参数。
     * @return 查询结果。
     */
    public static List<Record> searchAll(String sqlKey, Map<String, Object> params) {
        long s = System.currentTimeMillis();
        log.debug("开始执行SQL【{}】……", sqlKey);
        Record info = SqlBuilder.build(sqlKey, params);
        String sql = info.get("sql");
        Object[] objects = info.get("params");
        List<Record> records = Db.find(sql, objects);
        long e = System.currentTimeMillis();
        log.debug("SQL执行完成，共耗时{}毫秒。", e - s);
        return records;
    }

    /**
     * 查询一条数据。
     *
     * @param sqlKey SQL语句模板。
     * @param params 查询参数。
     * @return 查询结果。
     */
    public static Record searchFirst(String sqlKey, Map<String, Object> params) {
        long s = System.currentTimeMillis();
        log.debug("开始执行SQL【{}】……", sqlKey);
        Record info = SqlBuilder.build(sqlKey, params);
        String sql = info.get("sql");
        Object[] objects = info.get("params");
        Record data = Db.findFirst(sql, objects);
        long e = System.currentTimeMillis();
        log.debug("SQL执行完成，共耗时{}毫秒。", e - s);
        return data;
    }

    /**
     * 查询分页数据。
     *
     * @param index  当前页。
     * @param size   每页大小。
     * @param sqlKey SQL语句模板。
     * @param params 查询参数。
     * @return 分页查询结果。
     */
    public static Page<Record> paginate(int index, int size, String sqlKey, Map<String, Object> params) {
        long s = System.currentTimeMillis();
        log.debug("开始执行SQL【{}】……", sqlKey);
        Record info = SqlBuilder.build(sqlKey, params);
        String select = info.get("select");
        String sqlExceptSelect = info.get("sqlExceptSelect");
        Object[] objects = info.get("params");
        Page<Record> data = Db.paginate(index, size, select, sqlExceptSelect, objects);
        long e = System.currentTimeMillis();
        log.debug("SQL执行完成，共耗时{}毫秒。", e - s);
        return data;
    }

}
